package com.xxx.api;

import com.xxx.config.api.AbstractResource;
import com.xxx.config.exception.GenExceptCode;
import com.xxx.config.exception.ServiceException;
import com.xxx.util.FileUtil;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jdk.jfr.Description;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

import java.io.File;
import java.io.InputStream;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

@Path("/file")
@Produces(MediaType.APPLICATION_JSON)
public class FileResource extends AbstractResource {

    @POST
    @Path("/upload")
    @Description("上传文件")
    @Consumes(MediaType.MULTIPART_FORM_DATA + ";charset=UTF-8")
    public Response upload(@FormDataParam("file") InputStream inputStream,
                           @FormDataParam("file") FormDataContentDisposition disposition) {
        // fileName utf8 处理上传文件名称
        // 先decode转码，在用char转码
        String fileName = disposition.getFileName();

        // 兼容处理 RFC 6266规范 上传 文件编码格式
        String fileNamePrefix = "UTF-8''";
        boolean charFlag = fileName.contains(fileNamePrefix);
        if (charFlag) {
            fileName = URLDecoder.decode(fileName.replace(fileNamePrefix, ""), StandardCharsets.UTF_8);
        } else {
            fileName = new String(fileName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        }

        // file full path
        String filePath = "D:/files/" + fileName;
        File tempFile = new File(filePath);

        // 判断是否村子
        if (tempFile.isFile() && tempFile.exists()) {
            throw new ServiceException(GenExceptCode.Request_Param.name(), "上传失败，该文件已存在！");
        }

        // save file
        File file = FileUtil.saveFile(inputStream, tempFile);

        // 文件大小， 不要用 disposition 获取文件大小
//        disposition.getSize(); // 这个获取不到文件大小，不知道为啥。。。
        file.length();

        return this.success();
    }

    @GET
    @Path("/{id}/download")
    @Description("下载文件")
    public Response download(@PathParam("id") Integer id) {
        // 通过id在数据库中获取到文件的具体路径，如"D:/files/xxx.docx"
        String filePath = "";
        File file = new File(filePath);
        //如果文件不存在，提示404
        if (!file.exists()) {
            return this.err404();
        }
        // 直接将file对象给jersey处理就好
        return this.successDownload(file);
    }

    @GET
    @Path("/{id}/preview")
    @Description("预览查看文件")
    public Response preview(@PathParam("id") Integer id) {
        // 通过id在数据库中获取到文件的具体路径，如"D:/files/xxx.docx"
        String filePath = "";
        File file = new File(filePath);
        //如果文件不存在，提示404
        if (!file.exists()) {
            return this.err404();
        }
        // 直接将file对象给jersey处理就好
        return this.successPreview(file);
    }

}
